home *** CD-ROM | disk | FTP | other *** search
-
- ; Here is the second half of the RESOURCE program source
-
- page 60,132
-
- code segment byte public
-
- assume cs:code,ds:code
-
- extrn start:near,hsym:near,nwln0:near,delim:near,cmerr:near
- extrn nxcmd:near
-
- extrn fcb:word,tbuf:word
-
- public stack,wfiflg,quiflg,segflg,trmflg,segsho,opdtyp,segmsk,insloc
- public ofsptr,curpar,segsiz,dmpstt,dmpcnt,dmpend,curofs,wrtflg
- public ascbld,liscnt,cntenb,lastwd,doctbl,pcntr,rplptr,ecnt,xcptr
- public nxtctl,symtp,docend,ctlbas,fndadd,fndpc,nrsegs,mcbsiz
- public cofset,sdflg,ctltop,typndx,xcsw,hiload,symtyp,mcbbas,fake_comtbl
-
- public bdos,initbl,typech,gtcmd,cmdbuf,cmentr,flushf,prtstr,pstrg
- public cmkill,prword,gtval,pstg,typech,xo0,crlf,gtval,symbas,prntde
- public xo,addfn,keychk,cofset,prspc,pstar,lngth,locsym,ifasci
- public semic,dline,dcrlf,adb,strcnt,litall,cmpstr,litcmd,litdoc
- public litctl,litsym,fopen,cstbl,segnam,fclose,rdfchr,creatf
- public wtfchr,lita86,hexl,hexr,symluk,rdfchr,semic,tabc
-
- ;
- ;
- ;
- dline: cmp nlblfg,0
- jnz l11b9
- cmp segval,0
- jz l11b6
- cmp pfxcnt,0
- jnz l11b6
- mov segval,0 ;clr segval
- call pstg
- db 0ah,0dh,';ILLEGAL SEGMENT OVERRIDE '
- db 'ATTEMPTED !',0ah,0dh,0
- l11b6: mov al,segmsk
- mov opdtyp,al
- call hsym
- mov bx,rplptr
- mov al,bh
- or al,bl
- jz l11b9
- mov ch,byte ptr [bx]
- inc bx ;skip the *
- dec ch
- call nwln0 ;print replacing line with comment
- mov al,0ffh
- mov replsw,al
- l11b9: dec pfxcnt
- mov es,curpar
- mov nlblfg,0
- mov opdtyp, 04h ;ds is most likely
- mov pfflg,al
- mov dx,pcntr
- mov bx,curofs
- add bx,dx
- mov curadr,bx
- inc dx
- mov pcntr,dx
- mov ch,es:byte ptr [bx] ;opcode byte in ch
- mov cinstr,ch
- mov bx,offset opct-7
- mov dx,7 ;size of table item -1
- l11e3: add bx,dx
- mov al,cs:byte ptr [bx]
- or al,al
- jnz l11ee
- jmp pdbbyt ;end of table
- ;
- l11ee: and al,ch
- mov cl,al ;masked opcode
- inc bx
- mov al,cs:byte ptr [bx]
- cmp al,cl ;test against pattern
- jnz l11e3
- inc bx
- mov al,cs:byte ptr [bx] ;instr type index
- mov byte ptr typndx,al
- mov ch,5 ;size of literal
- lopclp: inc bx
- mov al,cs:byte ptr [bx]
- cmp al,'.' ;dot to be ignored
- jz nodot
- call typech ;output literal opcode
- nodot: dec ch
- jnz lopclp
- mov dl,byte ptr typndx
- and dl,3fh
- mov dh,0
- mov bx,offset jmptbl
- add bx,dx
- add bx,dx
- mov dx,cs:[bx]
- mov bx,curadr
- jmp dx
- ;
- ;
- jmptbl dw offset kind00
- dw offset kind01
- dw offset kind02
- dw offset kind03
- dw offset kind04
- dw offset kind05
- dw offset kind06
- dw offset kind07
- dw offset kind08
- dw offset kind09
- dw offset kind10
- dw offset kind11
- dw offset kind12
- dw offset kind13
- dw offset kind14
- dw offset kind15
- dw offset kind16
- dw offset kind17
- dw offset kind18
- dw offset kind19
- dw offset kind20
- dw offset kind21
- dw offset kind22
- dw offset kind23
- dw offset kind24
- dw offset kind25
- dw offset kind26
- dw offset kind27
- dw offset kind28
- dw offset kind29
- dw offset kind30
- dw offset kind31
- dw offset kind32
- dw offset kind33
- dw offset kind34
- dw offset kind35
- dw offset kind36
- dw offset kind37
- dw offset kind38
- dw offset kind39
- ;
- ;
- ;
- kind00: jmp dcrlf ;opcode only
- ;
- kind01: call tabc ;in/out
- mov al,es:[bx]
- test al,2
- jnz k01out
- test al,1
- jnz k01iw
- call pstg
- db 'AL,DX',0
- jmp dcrlf
- ;
- k01iw: call pstg
- db 'AX,DX',0
- jmp dcrlf
- ;
- k01out: test al,1
- jnz k01ow
- call pstg
- db 'DX,AL',0
- jmp dcrlf
- ;
- k01ow: call pstg
- db 'DX,AX',0
- jmp dcrlf
- ;
- kind02: inc pcntr
- call tabc
- mov al,es:[bx]
- test al,2
- jnz k02mtr
- call pstg
- db 'AX,',0
- jmp l139b
- ;
- k02mtr: inc curadr
- mov bx,curadr
- mov al,es:[bx]
- call psmnum
- call pstg
- db ',AX',0
- jmp dcrlf
- ;
- kind37: inc pcntr
- call tabc
- inc bx
- mov al,es:[bx]
- test al,2
- jnz k37mtr
- call pstg
- db 'AL,',0
- jmp l139b
- ;
- k37mtr: inc curadr
- mov bx,curadr
- mov al,es:[bx]
- call psmnum
- call pstg
- db ',AL',0
- jmp dcrlf
- ;
- kind03: call tabc
- mov al,es:[bx]
- test al,8
- jnz k03mtr
- inc pcntr
- and al,7
- call namrg8
- call comma
- jmp l139b
- ;
- k03mtr: inc pcntr
- inc pcntr
- and al,7
- call namr16
- call comma
- pwdval: ;print word value
- mov bx,curadr
- inc bx
- mov dx,es:[bx]
- push dx
- call symluk
- jnb hvsym3
- test word ptr sybflg,0ffh
- jz nosym3
- pop dx
- push dx
- call addsym
- nosym3: pop dx
- call pcon16
- jmp dcrlf
- ;
- hvsym3: call pstg
- db 'OFFSET ',0
- call pstrg
- pop dx
- jmp dcrlf
- ;
- kind04: inc pcntr ;8 bit arith
- call tabc
- call pstg
- db 'AL,',0
- l139b: inc curadr
- call bytopd
- jmp dcrlf
- ;
- bytopd: mov bx,curadr
- mov al,es:[bx]
- cmp al,' '
- jb l13c3
- cmp al,'Z'+1
- jnb l13c3
- mov al,es:[bx]
- call pqtchr
- mov al,'''' ;27h
- call typech ;ending quote
- call tabc
- call semic
- l13c3: mov al,es:[bx]
- call psmnum
- ret
- ;
- kind05: call tabc ;call/jmp relative address
- inc pcntr
- inc pcntr
- inc bx
- mov dx,es:[bx]
- inc bx
- inc bx
- sub bx,curofs
- add bx,dx
- mov dx,bx
- mov opdtyp,0ch ;cs, instruction
- call prntde
- jmp dcrlf
- ;
- kind06: call tabc
- inc pcntr
- inc pcntr
- call pstg
- db 'AX,',0
- jmp pwdval
- ;
- opdsy1: push dx
- call symluk ;check for symbol
- jnb havsym
- jmp short mkopds
- ;
- havsym: call pstrg ;display operand symbol
- pop dx
- ret
- ;
- prtdei: mov bx,curadr
- inc bx
- mov dx,es:[bx]
- prntde: push dx
- call symluk ;test for symbol
- jnb hvsym2
- mkopds: test byte ptr sybflg,0ffh ;building symbols?
- jz pmaddr
- pop dx
- push dx
- call addsym
- jmp pmaddr
- ;
- hvsym2: call pstrg
- test byte ptr trmflg,0ffh
- jz cmtadr
- pop dx
- ret
- ;
- cmtadr: call tabc
- call semic
- pmaddr: pop dx
- pcon16: mov al,dh
- or al,dl
- mov al,'0' ;30h
- jz l147d
- mov al,dh
- or al,al
- jz pcon8
- call xo0
- mov al,dl
- call xo
- phxsfx: mov al,'H' ;48h
- l147d: call typech
- ret
- ;
- pcon8: mov al,dl
- psmnum: cmp al,0ah
- jb padigt
- call xo0
- jmp phxsfx
- ;
- padigt: add al,'0' ;30h
- jmp l147d
- ;
- kind07: call tabc
- inc pcntr
- jmp l139b
- ;
- kind08: inc pcntr
- jmp dcrlf
- ;
- kind09: mov al,' ' ;lock/rep/repnz
- call typech ;space after prfx instr
- mov nlblfg,0ffh ;no label betw opcodes
- jmp l11b9 ;really continue same instr
- ;
- kind10: call pstg ;xlat opcode
- db 9,'AL',0
- jmp dcrlf
- ;
- kind11: call pcndop ;conditional jumps
- kind21: call tabc ;jcxz/jmps
- inc pcntr
- mov bx,curadr
- inc bx
- mov al,es:[bx]
- test al,80h ;what sign
- jnz k21neg
- inc bx
- call addfn
- jmp k21add
- ;
- k21neg: inc bx
- not al
- inc al
- xor ah,ah
- sub bx,ax
- k21add: sub bx,curofs
- mov dx,bx
- mov opdtyp,0ch ;cs, instruction
- call prntde
- jmp dcrlf
- ;
- kind12: call tabc ;movs/cmps
- mov al,es:[bx]
- and al,1
- jnz k12wrd
- call pstg
- db 'AL,AL',0
- jmp dcrlf
- ;
- k12wrd: call pstg
- db 'AX,AX',0
- jmp dcrlf
- ;
- kind13: call pstg ;xchg ax with ??
- db 9,'AX,',0
- mov al,es:[bx]
- and al,7
- call namr16
- jmp dcrlf
- ;
- kind14: call pstg ;unimplemented opcodes
- db 'DB',9,'0',0
- mov al,es:[bx]
- call xo
- mov al,'H' ;48h
- call typech
- jmp dcrlf
- ;
- kind15: call tabc ;one 16 bit register
- mov al,es:[bx]
- and al,7
- call namr16
- jmp dcrlf
- ;
- l1552: mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,7
- jmp l156d
- ;
- l155e: mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,38h
- shr al,1
- shr al,1
- shr al,1
- l156d: push ax
- mov bx,curadr
- mov al,es:[bx]
- test al,1
- jnz l157c
- pop ax
- jmp namrg8
- ;
- l157c: pop ax
- jmp namr16
- ;
- l1580: mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,0c0h
- cmp al,0
- jz l15ba
- cmp al,0c0h
- jz l1594
- jmp l15e0
- ;
- l1594: inc pcntr
- mov bx,curadr
- mov al,es:[bx]
- test al,2
- jnz l15ae
- call l1552
- call comma
- call l155e
- jmp dcrlf
- ;
- l15ae: call l155e
- call comma
- call l1552
- jmp dcrlf
- ;
- l15ba: inc pcntr
- mov bx,curadr
- mov al,es:[bx]
- test al,2
- jnz l15d4
- call l1606
- call comma
- call l155e
- jmp dcrlf
- ;
- l15d4: call l155e
- call comma
- call l1606
- jmp dcrlf
- ;
- l15e0: inc pcntr
- mov bx,curadr
- mov al,es:[bx]
- test al,2
- jnz l15fa
- call l164f
- call comma
- call l155e
- jmp dcrlf
- ;
- l15fa: call l155e
- call comma
- call l164f
- jmp dcrlf
- ;
- l1606: call psgprf ;show segment first
- mov bx,curadr
- mov al,es:[bx]
- test al,1
- jnz l1623
- call pstg
- db 'BYTE PTR ',0
- or byte ptr opdtyp,01h ;byte size
- jmp l1630
- ;
- l1623: call pstg
- db 'WORD PTR ',0
- or byte ptr opdtyp,02h ;word size
- l1630: call pndxop
- mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,7
- cmp al,6
- jnz l164e
- inc pcntr
- inc pcntr
- inc bx
- mov dx,es:[bx]
- call opdsy1
- l164e: ret
- ;
- l164f: call psgprf
- mov bx,curadr
- mov al,es:[bx]
- test al,1
- jnz l166c
- call pstg
- db 'BYTE PTR ',0
- or byte ptr opdtyp,01h ;byte size
- jmp l1679
- ;
- l166c: call pstg
- db 'WORD PTR ',0
- or byte ptr opdtyp,02h ;word size
- l1679: inc pcntr
- mov bx,curadr
- inc bx
- mov al,es:[bx]
- inc bx
- test al,80h
- jnz l1692
- mov al,es:[bx]
- call psmnum
- call pndxop
- ret
- ;
- l1692: inc pcntr
- mov dx,es:[bx]
- call pcon16
- call pndxop
- ret
- ;
- psgprf: mov al,segval
- test al,38h
- jz l16b7 ;no prefix
- and al,18h
- call psgpfx
- call colon
- mov al,segval
- shr al,1
- and al,0ch
- xor al,08h ;invert b3 for better ascii
- mov opdtyp,al ;segment info
- mov segval,0
- call prspc
- ret
- ;
- l16b7: ret
- ;
- namr16: mov bx,offset rtb16
- add al,al
- call addfn
- mov al,cs:[bx]
- call typech
- inc bx
- mov al,cs:[bx]
- jmp typech
- ;
- rtb16 db 'AX','CX','DX','BX','SP','BP','SI','DI'
- ;
- namrg8: mov bx,offset rtb08
- add al,al
- call addfn
- mov al,cs:[bx]
- call typech
- inc bx
- mov al,cs:[bx]
- jmp typech
- ;
- rtb08 db 'AL','CL','DL','BL','AH','CH','DH','BH'
- ;
- kind22: call tabc
- mov al,es:[bx]
- and al,1
- jnz k22wrd
- call pstg
- db 'AL',0
- jmp dcrlf
- ;
- k22wrd: call pstg
- db 'AX',0
- jmp dcrlf
- ;
- kind23: mov al,es:[bx] ;segment ovrd prfx
- and al,38h
- mov segval,al
- mov nlblfg,0ffh
- mov pfxcnt,1
- jmp l11b9 ;to continue instr
- ;
- kind24: call tabc ;push/pop seg regs
- mov al,es:[bx]
- and al,18h
- call psgpfx
- jmp dcrlf
- ;
- kind25: call tabc ;mov reg <-> mem
- inc pcntr
- inc pcntr
- mov al,es:[bx]
- test al,2
- jz k25mtr ;reg<-mem
- call pmemor
- call comma
- call paccum
- jmp dcrlf
- ;
- k25mtr: call paccum
- call comma
- call pmemor
- jmp dcrlf
- ;
- paccum: mov bx,curadr
- mov al,es:[bx]
- test al,1
- jnz acc16b
- call pstg
- db 'AL',0
- ret
- ;
- acc16b: call pstg
- db 'AX',0
- ret
- ;
- pmemor: call psgprf
- mov bx,curadr
- mov al,es:[bx]
- test al,1
- jnz l17a6
- call pstg
- db 'BYTE PTR ',0
- or byte ptr opdtyp,01h ;byte size
- jmp l17b3
- ;
- l17a6: call pstg
- db 'WORD PTR ',0
- or byte ptr opdtyp,02h ;word size
- l17b3: mov bx,curadr
- inc bx
- mov dx,es:[bx]
- call opdsy1
- ret
- ;
- kind26: inc bx
- mov al,es:[bx]
- and al,38h
- cmp al,30h ;stack seg?
- jnz l17ce
- jmp l1c16
- ;
- l17ce: call pshfop
- call tabc
- call l17f5
- call comma
- mov bx,curadr
- mov al,es:[bx]
- and al,2
- jz k26sh1
- call pstg
- db 'CL',0 ;shift count in cl
- jmp dcrlf
- ;
- k26sh1: mov al,'1' ;31h
- call typech
- jmp dcrlf
- ;
- l17f5: inc pcntr
- mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,0c0h
- cmp al,0c0h
- jz l180d
- cmp al,0
- jz l1815
- jmp l1811
- ;
- l180d: call l1552
- ret
- ;
- l1811: call l164f
- ret
- ;
- l1815: call l1606
- ret
- ;
- kind27: inc bx
- mov al,es:[bx]
- and al,38h
- jz l1827
- jmp l1c16
- ;
- l1827: call pstg
- db 'POP',0
- call tabc
- call l17f5
- jmp dcrlf
- ;
- kind28: inc bx
- mov al,es:[bx]
- test al,20h
- jz l1845
- jmp l1c16
- ;
- l1845: call pstg
- db 'MOV',0
- call tabc
- mov bx,curadr
- mov al,es:[bx]
- test al,2
- jnz l1865
- call l187d
- call comma
- call l1871
- jmp dcrlf
- ;
- l1865: call l1871
- call comma
- call l187d
- jmp dcrlf
- ;
- l1871: mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,18h
- jmp psgpfx
- ;
- l187d: inc pcntr
- mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,0c0h
- cmp al,0c0h
- jz l1895
- cmp al,0
- jz l18a1
- jmp l18a4
- ;
- l1895: mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,7
- jmp namr16
- ;
- l18a1: jmp l18a7
- ;
- l18a4: jmp l18ba
- ;
- l18a7: call psgprf
- call pstg
- db 'WORD PTR ',0
- or byte ptr opdtyp,02h ;word size
- jmp l1630
- ;
- l18ba: call psgprf
- call pstg
- db 'WORD PTR ',0
- or byte ptr opdtyp,02h ;word size
- jmp l1679
- ;
- kind29: inc bx
- mov al,es:[bx]
- and al,38h
- jz l18db
- jmp l1c16
- ;
- l18db: call pstg
- db 'MOV',0
- call tabc
- jmp l1c19
- ;
- kind30: call tabc
- inc bx
- mov al,es:[bx]
- and al,38h
- shr al,1
- shr al,1
- shr al,1
- call namr16
- call comma
- call l1906
- jmp dcrlf
- ;
- l1906: inc pcntr
- mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,0c0h
- cmp al,0
- jz l18a1
- jmp l18a4
- ;
- kind38: call tabc
- inc bx
- and al,38h
- shr al,1
- shr al,1
- shr al,1
- call namr16
- call comma
- jmp l1a19
- ;
- kind31: inc bx
- mov al,es:[bx]
- and al,38h
- cmp al,8
- jnz l1943
- jmp l1c16
- ;
- l1943: call pmisci
- call tabc
- mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,38h
- jz l195a
- call l17f5
- jmp dcrlf
- ;
- l195a: jmp l1c19
- ;
- kind32: inc bx
- mov al,es:[bx]
- and al,38h
- cmp al,0
- jz l1971
- cmp al,8
- jz l1971
- jmp l1c16
- ;
- l1971: cmp al,8
- jz l197f
- call pstg
- db 'INC',0
- jmp l1986
- ;
- l197f: call pstg
- db 'DEC',0
- l1986: call tabc
- call l17f5
- jmp dcrlf
- ;
- kind33: inc bx
- mov al,es:[bx] ;2nd instr byte
- and al,38h ;sub-opcode
- cmp al,38h
- jnz l199f
- jmp l1c16 ;make db, not instr
- ;
- l199f: cmp al,0 ;inc reg/mem word
- jz l19bc
- cmp al,8 ;dec reg/mem word
- jz l19bc
- cmp al,30h ;push reg/mem
- jz l19da
- cmp al,18h ;indir interseg call
- jz l1a02
- cmp al,28h ;indir interseg jmp
- jz l1a0e
- cmp al,10h ;reg/mem indir inseg call
- jz l19e5
- cmp al,20h ;reg/mem indir inseg jmp
- jz l19f4
- hlt ;cant get to here
- ;
- l19bc: cmp al,8
- jz l19ca
- call pstg
- db 'INC',0
- jmp l19d1
- ;
- l19ca: call pstg
- db 'DEC',0
- l19d1: call tabc
- call l1906
- jmp dcrlf
- ;
- l19da: call pstg
- db 'PUSH',0
- jmp l19d1
- ;
- l19e5: call pstg
- db 'CALL',9,0
- call l17f5
- jmp dcrlf
- ;
- l19f4: call pstg
- db 'JMP',9,0
- call l17f5
- mov cinstr,0e9h ;fake out for semic delimiter
- jmp dcrlf
- ;
- l1a02: call pstg
- db 'CALLF',0
- jmp l1a16
- ;
- l1a0e: call pstg
- db 'JMPF',0
- mov cinstr,0e9h ;semic delim fakeout
- l1a16: call tabc
- l1a19: inc pcntr
- mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,0c0h
- cmp al,0
- jz l1a2d
- jmp l1a41
- ;
- l1a2d: call pstg
- db 'DWORD PTR ',0
- or byte ptr opdtyp,03h ;dword size
- call l1630
- jmp dcrlf
- ;
- l1a41: call pstg
- db 'DWORD PTR ',0
- or byte ptr opdtyp,03h ;dword size
- call l1679
- jmp dcrlf
- ;
- kind34: call pstg
- db ';CALLF TO CSEG',9,0
- inc bx
- inc bx
- inc bx
- mov dx,es:[bx]
- call pcon16
- call dcrlf
- call tabc
- call pstg
- db 'CALLF',9,0
- inc pcntr
- inc pcntr
- inc pcntr
- inc pcntr
- mov bx,curadr
- inc bx
- mov dx,es:[bx]
- call prtdei
- jmp dcrlf
- ;
- kind35: call pstg
- db '; JMPF TO CSEG',9,0
- inc bx
- inc bx
- inc bx
- mov dx,es:[bx]
- call pcon16
- call dcrlf
- call tabc
- call pstg
- db 'JMPF',9,0
- inc pcntr
- inc pcntr
- inc pcntr
- inc pcntr
- mov bx,curadr
- inc bx
- mov dx,es:[bx]
- mov bx,curadr
- inc bx
- inc bx
- inc bx
- inc bx
- inc bx
- sub bx,curofs
- add bx,dx
- mov dx,bx
- call prntde
- jmp dcrlf
- ;
- kind36: call tabc
- inc bx
- mov dx,es:[bx]
- call pcon16
- inc pcntr
- inc pcntr
- jmp dcrlf
- ;
- kind16: call tabc
- mov al,es:[bx]
- and al,7
- mov ah,al
- inc bx
- mov al,es:[bx]
- and al,38h
- add ah,al
- mov al,ah
- call psmnum
- call comma
- call l187d
- jmp dcrlf
- ;
- kind17: mov al,es:[bx]
- and al,3
- cmp al,0
- jnz l1b4c
- call pstg
- db 'NE',0
- jmp kind21
- ;
- l1b4c: cmp al,1
- jnz l1b55
- call pstg
- db 'E',0
- l1b55: jmp kind21
- ;
- kind18: call parit1
- call tabc
- jmp l1580
- ;
- kind19: call tabc
- jmp l1580
- ;
- kind39: inc bx
- mov al,es:[bx]
- and al,38h
- cmp al,8
- jz l1bba
- cmp al,20h
- jz l1bba
- cmp al,30h
- jz l1bba
- call pstg
- db 'DB',9,0
- mov bx,curadr
- mov al,es:[bx]
- call psmnum
- call comma
- inc bx
- mov al,es:[bx]
- call psmnum
- call comma
- inc bx
- mov al,es:[bx]
- call psmnum
- mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,0c0h
- cmp al,80h
- jz l1bbd
- cmp al,40h
- jz l1bd6
- mov al,es:[bx]
- and al,0c7h
- cmp al,6
- jz l1bbd
- jmp l1be3
- ;
- l1bba: jmp l1c16
- ;
- l1bbd: call comma
- inc bx
- inc bx
- mov al,es:[bx]
- call psmnum
- call comma
- inc bx
- mov al,es:[bx]
- call psmnum
- call dcrlf
- jmp l1be3
- ;
- l1bd6: call comma
- inc bx
- inc bx
- mov al,es:[bx]
- call psmnum
- call dcrlf
- l1be3: call pstg
- db ';',9,0
- mov bx,curadr
- jmp l1c0c
- ;
- kind20: mov al,es:[bx]
- and al,2
- jz l1c0c
- inc bx
- mov al,es:[bx]
- and al,38h
- cmp al,8
- jz l1c16
- cmp al,20h
- jz l1c16
- cmp al,30h
- jz l1c16
- dec bx
- l1c0c: inc bx
- call parith
- call tabc
- jmp l1c19
- ;
- l1c16: jmp pdbbyt
- ;
- l1c19: mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,0c0h
- cmp al,0
- jz l1c7a
- cmp al,0c0h
- jz l1c47
- jmp l1c2d
- ;
- l1c2d: inc pcntr
- call l164f
- call comma
- mov bx,curadr
- inc bx
- mov al,es:[bx]
- inc bx
- test al,80h
- jz l1c44
- inc bx
- l1c44: jmp l1c93
- ;
- l1c47: inc pcntr
- call l1552
- call comma
- inc pcntr
- mov bx,curadr
- mov al,es:[bx]
- inc bx
- inc bx
- l1c5d: call l1cbd
- jz l1c66
- test al,1
- jnz l1c6e
- l1c66: mov al,es:[bx]
- call psmnum
- jmp dcrlf
- ;
- l1c6e: inc pcntr
- mov dx,es:[bx]
- call pcon16
- jmp dcrlf
- ;
- l1c7a: inc pcntr
- call l1606
- call comma
- mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,7
- cmp al,6
- jnz l1c93
- inc bx
- inc bx
- l1c93: inc bx
- inc pcntr
- push bx
- mov bx,curadr
- mov al,es:[bx]
- pop bx
- jmp l1c5d ;share common code
- ;
- l1cbd: push bx
- push ax
- mov bx,curadr
- mov al,es:[bx]
- cmp al,83h
- pop ax
- pop bx
- ret
- ;
- comma: mov al,',' ;2ch
- jmp typech
- ;
- tabc: mov al,9
- jmp typech
- ;
- semic: mov al,';' ;3bh
- jmp typech
- ;
- colon: mov al,':' ;3ah
- jmp typech
- ;
- pdbbyt: call pstg
- db 'DB',9,0
- jmp bytopd
- ;
- psgpfx: shr al,1
- shr al,1
- mov bx,offset segtbl
- mov ch,2
- call addfn
- jmp popstx
- ;
- pndxop: mov bx,offset indtbl
- push bx
- l1d05: mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,7
- shl al,1
- shl al,1
- shl al,1
- pop bx
- mov ch,8
- call addfn
- jmp popstx
- ;
- pmisci: mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,38h
- shr al,1
- mov bx,offset msctbl
- mov ch,4
- call addfn
- jmp popstx
- ;
- pshfop: mov bx,curadr
- inc bx
- mov al,es:[bx]
- and al,38h
- shr al,1
- shr al,1
- mov ah,al
- shr al,1
- add al,ah
- mov bx,offset shftbl
- jmp popst3
- ;
- parit1: mov bx,curadr
- parith: mov al,es:[bx]
- and al,38h
- shr al,1
- shr al,1
- mov ah,al
- shr al,1
- add al,ah
- mov bx,offset aritbl
- jmp popst3
- ;
- pcndop: mov bx,curadr
- mov al,es:[bx]
- and al,0fh
- mov ch,al
- add al,al
- add al,ch
- mov bx,offset cndtbl
- popst3: mov ch,3
- call addfn
- popstx: mov al,cs:byte ptr [bx]
- cmp al,'.' ;2eh
- jz popskp
- call typech
- popskp: inc bx
- dec ch
- jnz popstx
- ret
- ;
- pqtchr: push ax
- mov al,'''' ;27h
- call typech
- pop ax
- cmp al,'''' ;27h
- jz pqtqt
- jmp typech
- ;
- pqtqt: push ax
- call typech
- pop ax
- jmp typech
- ;
- addfn: add al,bl
- mov bl,al
- jb l1da6
- ret
- ;
- l1da6: inc bh
- ret
- ;
- xo0: cmp al,0a0h
- jnb l1db0
- jmp xo
- ;
- l1db0: push ax
- mov al,'0' ;30h
- call typech
- pop ax
- jmp xo
- ;
- pstrg: mov al,byte ptr [bx]
- call typech
- inc bx
- dec ch
- jnz pstrg
- ret
- ;
- ;
- segtbl db 'ES','CS','SS','DS'
- ;
- cndtbl db 'O..','NO.','B..','NB.'
- db 'Z..','NZ.','NA.','A..'
- db 'S..','NS.','PE.','PO.'
- db 'NGE','GE.','NG.','G..'
- ;
- shftbl db 'ROL','ROR','RCL','RCR'
- db 'SHL','SHR','...','SAR'
- ;
- msctbl db 'TEST','....','NOT.','NEG.'
- db 'MUL.','IMUL','DIV.','IDIV'
- ;
- aritbl db 'ADD','OR.','ADC','SBB'
- db 'AND','SUB','XOR','CMP'
- ;
- indtbl db '[BX+SI].','[BX+DI].','[BP+SI].','[BP+DI].'
- db '[SI]....','[DI]....','........','[BX]....'
- db '[BX+SI].','[BX+DI].','[BP+SI].','[BP+DI].'
- db '[SI]....','[DI]....','........','[BX]....'
- ;
- ;
- ; opcode mask, opcode pattern, kind, literal
- ;
- opct db 0ffh,098h,00,'CBW..' ;no operands
- db 0ffh,027h,00,'DAA..'
- db 0ffh,02fh,00,'DAS..'
- db 0ffh,037h,00,'AAA..'
- db 0ffh,0d7h,10,'XLAT.'
- db 0ffh,0c3h,00,'RET..'
- db 0ffh,0cbh,00,'RETF.'
- db 0ffh,099h,00,'CWD..'
- db 0ffh,09bh,00,'WAIT.'
- db 0ffh,09ch,00,'PUSHF'
- db 0ffh,09dh,00,'POPF.'
- db 0ffh,09eh,00,'SAHF.'
- db 0ffh,09fh,00,'LAHF.'
- db 0ffh,0ceh,00,'INTO.'
- db 0ffh,0cfh,00,'IRET.'
- db 0ffh,0f4h,00,'HLT..'
- db 0ffh,0f5h,00,'CMC..'
- db 0ffh,0f8h,00,'CLC..'
- db 0ffh,0f9h,00,'STC..'
- db 0ffh,0fah,00,'CLI..'
- db 0ffh,0fbh,00,'STI..'
- db 0ffh,0fch,00,'CLD..'
- db 0ffh,0fdh,00,'STD..'
- db 0ffh,090h,00,'NOP..'
- db 0ffh,03fh,00,'AAS..'
- db 0f8h,040h,15,'INC..' ;one 16 bit reg
- db 0f8h,048h,15,'DEC..'
- db 0f8h,050h,15,'PUSH.'
- db 0f8h,058h,15,'POP..'
- db 0ffh,0f3h,09,'REP..' ;prefix
- db 0ffh,0f2h,09,'REPNZ'
- db 0f8h,090h,13,'XCHG.'
- db 0feh,0a4h,12,'MOVS.' ;string functs
- db 0feh,0a6h,12,'CMPS.'
- db 0feh,0aah,22,'STOS.'
- db 0feh,0ach,22,'LODS.'
- db 0feh,0aeh,22,'SCAS.'
- db 0ffh,0f0h,09,'LOCK.'
- db 0fch,0d0h,26,'.....'
- db 0ffh,08fh,27,'.....'
- db 0ffh,08ch,28,'.....'
- db 0ffh,08eh,28,'.....'
- db 0feh,0c6h,29,'.....'
- db 0ffh,0c4h,38,'LES..'
- db 0ffh,0c5h,38,'LDS..'
- db 0feh,0f6h,31,'.....'
- db 0ffh,0feh,32,'.....'
- db 0ffh,0ffh,33,'.....' ;misc call/jmp
- db 0ffh,09ah,34,'.....'
- db 0ffh,0eah,35,'.....'
- db 0f8h,0d8h,16,'ESC..'
- db 0ffh,0c2h,36,'RET..'
- db 0ffh,0cah,36,'RETF.'
- db 0ffh,026h,23,'.....' ;seg ovrd prefix
- db 0ffh,02eh,23,'.....'
- db 0ffh,036h,23,'.....'
- db 0ffh,03eh,23,'.....'
- db 0ffh,004h,04,'ADD..' ;arith 8 bit to acc
- db 0ffh,00ch,04,'OR...'
- db 0ffh,014h,04,'ADC..'
- db 0ffh,01ch,04,'SBB..'
- db 0ffh,024h,04,'AND..'
- db 0ffh,02ch,04,'SUB..'
- db 0ffh,034h,04,'XOR..'
- db 0ffh,03ch,04,'CMP..'
- db 0ffh,0a8h,04,'TEST.'
- db 0fch,080h,20,'.....' ;arith immed to reg/mem
- db 0ffh,080h,39,'.....'
- db 0ffh,005h,06,'ADD..' ;arith 16 bit to acc
- db 0ffh,00dh,06,'OR...'
- db 0ffh,015h,06,'ADC..'
- db 0ffh,01dh,06,'SBB..'
- db 0ffh,025h,06,'AND..'
- db 0ffh,02dh,06,'SUB..'
- db 0ffh,035h,06,'XOR..'
- db 0ffh,03dh,06,'CMP..'
- db 0ffh,0a9h,06,'TEST.'
- db 0f0h,0b0h,03,'MOV..'
- db 0fch,0a0h,25,'MOV..'
- db 0ffh,0e4h,37,'IN...'
- db 0ffh,0e6h,37,'OUT..'
- db 0ffh,0e5h,02,'IN...'
- db 0ffh,0e7h,02,'OUT..'
- db 0feh,0ech,01,'IN...'
- db 0feh,0eeh,01,'OUT..'
- db 0c4h,000h,18,'.....'
- db 0feh,084h,19,'TEST.'
- db 0feh,086h,19,'XCHG.'
- db 0fch,088h,19,'MOV..'
- db 0ffh,08dh,30,'LEA..'
- db 0ffh,0cch,00,'INT 3'
- db 0ffh,0cdh,07,'INT..'
- db 0ffh,0d4h,08,'AAM..'
- db 0ffh,0d5h,08,'AAD..'
- db 0f0h,070h,11,'J....'
- db 0ffh,0e3h,21,'JCXZ.'
- db 0ffh,0ebh,21,'JMPS.'
- db 0ffh,0e8h,05,'CALL.'
- db 0ffh,0e9h,05,'JMP..'
- db 0feh,0e0h,17,'LOOP.'
- db 0ffh,0e2h,17,'LOOP.'
- db 0ffh,006h,24,'PUSH.'
- db 0ffh,007h,24,'POP..'
- db 0ffh,00eh,24,'PUSH.'
- db 0ffh,016h,24,'PUSH.'
- db 0ffh,017h,24,'POP..'
- db 0ffh,01eh,24,'PUSH.'
- db 0ffh,01fh,24,'POP..'
- db 0ffh,060h,00,'PUSHA' ;80186
- db 0ffh,061h,00,'POPA.' ;80186
- db 0ffh,062h,14,'.....' ;80186 bound
- db 0fdh,068h,14,'.....' ;80186 push/pop immed
- db 0fdh,069h,14,'.....' ;80186 imul immed
- db 0feh,06ch,14,'.....' ;80186 ins [dx]
- db 0feh,06eh,14,'.....' ;80186 outs [dx]
- db 0feh,0c0h,14,'.....' ;80186 shft by cnt
- db 0ffh,0c8h,14,'.....' ;80186 enter
- db 0ffh,0c9h,00,'LEAVE' ;80186
- db 0ffh,0f2h,14,'.....' ;80186 ins/outs (cc-cf)
- db 0f0h,060h,14,'.....' ;unimplemented codes
- db 0ffh,00fh,14,'.....'
- db 0ffh,0d6h,14,'.....'
- db 0ffh,0f1h,14,'.....'
- db 0
- ;
- ;
- ; symbol table structure, variable lgth records
- ; 2 bytes address, 1 byte string lgth,
- ; 1 byte seg/type, n bytes literal string
- ; table end defined by lgth byte = 0
- ; first free byte pntd by symtp
- ; table stored in ascii string sort order
- ; type b1-0: 0=instr, 1=byte, 2=word, 3=dword
- ; type b3-2: 0=ss, 1=ds, 2=es, 3=cs
- ; (b3 inverted from instr. code)
- ;
- addsym: mov bx,offset cmdbuf ;generate symbol literal
- mov byte ptr [bx],'L' ;first symbol char
- inc bx
- mov al,dh
- call stohex
- mov al,dl
- call stohex
- mov bx,offset cmdbuf
- mov ch,5 ;fixed string lenght
- symtch: call locsym
- jb entsym ;if sym at addr doesnt exist
- mov [bx],dx
- inc bx
- ret
- ;
- entsym: push bx ;open up space for new entry
- push dx
- push cx
- mov bx,symtp
- mov dx,bx
- mov al,ch
- mov ah,0
- add al,4
- add bx,ax
- mov symtp,bx ;new end
- mov byte ptr 3[bx],0 ;zero lgth byte
- mov cx,bx
- mov bx,insloc
- l22a5: cmp dx,bx
- jz inssym
- dec dx
- dec cx
- xchg bx,dx
- mov al,[bx]
- xchg bx,dx
- xchg bx,cx
- mov [bx],al
- xchg bx,cx
- jmp l22a5
- ;
- inssym: pop cx ;put new entry in hole just made
- pop dx
- mov [bx],dx
- inc bx
- inc bx
- mov al,opdtyp
- mov [bx],al
- inc bx
- mov [bx],ch
- pop dx
- l22cb: inc bx
- xchg bx,dx
- mov al,[bx]
- xchg bx,dx
- mov [bx],al
- inc dx
- dec ch
- jnz l22cb
- ret
- ;
- locsym: push dx ;find symbol by literal match
- push bx ;string start
- mov bx,offset symbas
- nxstch: pop dx
- push dx ;string start
- inc bx
- inc bx
- inc bx ;skip fixed fields
- push bx
- mov al,[bx] ;string lgth
- inc bx
- or al,al
- jz strstp ;table end
- cmp al,ch ;compare lengths
- jb shtstr ;table is shorter
- jnz lngstr
- mov cl,al ;compare count
- call cmpstr
- jz symfnd ;found right string
- jb strstp ;gone too far
- l22fa: pop bx ;table pntr
- mov al,[bx]
- inc bx ;string start
- sub ah,ah ;zero hi byte
- add bx,ax
- jmp nxstch
- ;
- symfnd: pop bx ;strg size ptr
- dec bx
- dec bx
- dec bx ;back to entry start
- pop dx ;adj stack
- pop dx ;restore dx
- or al,al ;adjust flags
- ret
- ;
- shtstr: mov cl,al ;shorter size
- call cmpstr
- jnb l22fa
- jmp strstp
- ;
- lngstr: mov cl,ch ;shorter size
- call cmpstr
- jz strstp
- jnb l22fa
- strstp: pop bx ;not found exit, set best approx ptr
- dec bx
- dec bx
- dec bx ;record start
- mov insloc,bx ;closest match ptr for insert
- pop bx
- pop dx
- stc ;not found flag
- ret
- ;
- symluk: mov bx,offset symbas ;lookup symbol for usage
- symlk2: mov ax,[bx] ;by address in dx
- inc bx
- cmp ax,dx
- jz symlk6 ;right address
- inc bx
- inc bx
- symlk3: mov al,[bx] ;possible end flag
- or al,al
- stc
- jnz l2348 ;not end
- ret
- ;
- l2348: inc bx ;count size byte
- mov ah,0
- add bx,ax ;adj for string size
- jmp short symlk2
- ;
- symlk6: inc bx
- mov al,[bx] ;flag byte
- mov symtyp,al ;flags for this symbol
- inc bx
- test byte ptr nrsegs,0feh ;more than one?
- jz mdl80 ;only one segment
- xor al,opdtyp ;= current?
- and al,00ch ;isolate seg bits
- jnz symlk3 ;if not rite segment
- mdl80: mov al,[bx] ;string size
- inc bx
- mov ch,al
- or al,al
- jnz l235fn
- stc
- l235fn: ret
- ;
- ;
- ;
- cmentr: mov bx,offset cmdbuf+3h
- call gtval ;symbol value
- mov al,[bx]
- call delim ;must exist
- l2374: inc bx
- mov al,[bx]
- cmp al,'.'
- jz l237e ;must prefix string
- call cmerr
- ;
- l237e: push dx ;value
- push bx ;buffer pointer
- ; ensure label doesnt exist
- call lngth ;parse string
- call locsym
- jb nohit
- call prtstr
- db 'Duplicate label - not entered',0dh,0ah,7,0
- call cmerr
- ;
- nohit: pop bx
- pop dx
- push dx ;restore regs to
- push bx ;value & buff ptr
- call symluk
- jb symnf
- push bx
- call ucrlf
- call pstrg
- call prtstr
- db ' was killed.',7,0dh,0ah,0
- pop bx
- dec bx
- dec bx
- mov al,[bx] ;old flags
- mov opdtyp,al ;for new symbol
- dec bx
- dec bx
- call lkill
- symnf: pop bx ;orig cmd ptr
- call lngth
- pop dx ;symbol value
- call symtch
- jmp nxcmd
- ;
- ;
- ;
- cmkill: mov bx,offset cmdbuf+3
- mov al,[bx]
- cmp al,'.' ;2eh
- jz l2396
- call cmerr
- ;
- l2396: call lngth
- call locsym
- jnb l23a1 ;found it
- call cmerr
- ;
- l23a1: call lkill
- jmp nxcmd
- ;
- lkill: mov cx,bx
- inc bx
- inc bx
- inc bx
- mov al,[bx]
- sub ah,ah
- add bx,ax
- inc bx
- xchg bx,dx ;hold in dx
- mov bx,symtp
- l23b8: cmp dx,bx ;at top yet?
- jz l23d5
- xchg bx,dx
- mov al,[bx] ;from [dx]
- xchg bx,dx
- xchg bx,cx
- mov [bx],al ;to [cx]
- xchg bx,cx
- inc cx
- inc dx
- jmp l23b8
- ;
- l23d5: mov bx,cx
- mov symtp,bx ;new top
- mov byte ptr 3[bx],0
- ret
- ;
- lngth: inc bx ;skip dot symbol flag
- mov ch,0 ;clear counter
- push bx ;save string start pntr
- nxtcnt: mov al,[bx] ;char to test
- inc bx
- inc ch ;count it
- cmp al,','
- jz gettyp
- cmp al,'+' ;2bh
- jz nxtcnt
- cmp al,'-' ;2dh
- jz nxtcnt
- cmp al,'0' ;30h
- jb endcnt
- cmp al,'9'+1 ;3ah
- jb nxtcnt
- cmp al,'A' ;41h
- jb endcnt
- cmp al,'Z'+1
- jb nxtcnt
- endcnt: dec ch ;dont count terminator
- jnz gudcnt
- ervec1: call cmerr
- ;
- gudcnt: dec bx
- xchg bx,dx ;delimiter pntr in dx
- pop bx ;string start pntr in bx
- ret
- ;
- gettyp: mov al,[bx] ;next char is type
- cmp al,'.' ;may be a string coming
- jz endcnt ;yes, leave alone now
- cmp al,'@'
- jb ervec1
- cmp al,'P'
- jnb ervec1
- mov opdtyp,al ;put where inssym wants it
- jmp endcnt ;done now
- ;
- stohex: push ax
- call hexl
- mov [bx],al
- inc bx
- pop ax
- call hexr
- mov [bx],al
- inc bx
- ret
- ;
- hexl: rcr al,1
- rcr al,1
- rcr al,1
- rcr al,1
- hexr: and al,0fh
- cmp al,0ah
- jb hexrn
- add al,7
- hexrn: add al,'0' ;30h
- ret
- ;
- xo: push ax
- call hexl
- call typech
- pop ax
- call hexr
- jmp typech
- ;
- prword: mov al,bh
- call xo
- mov al,bl
- call xo
- prspc: mov al,' ' ;20h
- jmp typech
- ;
- gtval: mov al,[bx]
- cmp al,'.' ;2eh
- jz gtsymb
- mov dx,0
- hexbi: mov al,[bx]
- cmp al,'0' ;30h
- jnb l245f
- ret
- ;
- l245f: cmp al,'9'+1 ;3ah
- jb cvnum
- cmp al,'A' ;41h
- jnb l2468
- ret
- ;
- l2468: cmp al,'G' ;47h
- jb l246d
- ret
- ;
- l246d: sub al,7
- cvnum: sub al,'0' ;30h
- xchg bx,dx
- add bx,bx
- add bx,bx
- add bx,bx
- add bx,bx
- add al,bl
- mov bl,al
- xchg bx,dx
- inc bx
- jmp hexbi
- ;
- gtsymb: call lngth
- push dx
- call locsym
- jnb l2491 ;it exists
- call cmerr
- ;
- l2491: mov dx,[bx] ;symbol value
- pop bx
- mov al,[bx] ;string terminator
- ret
- ;
- ;
- fopen: push bx
- mov bx,offset tbuf+128
- mov ofiptr,bx
- xor al,al
- mov byte ptr fcb+32,al
- mov dx,offset fcb
- mov ah,0fh
- call bdos
- pop bx
- inc al
- jz l24b3
- ret
- ;
- l24b3: call prtstr
- db '++FILE NOT FOUND',0dh,0ah,0
- stc
- ret
- ;
- fclose: mov dx,offset fcb
- mov ah,16
- call bdos
- ret
- ;
- rdfchr: push bx
- mov bx,ofiptr
- test bh,1
- jz l24ea
- push cx
- push dx
- mov dx,offset fcb
- mov ah,14h
- call bdos
- or al,al
- pop dx
- pop cx
- mov bx,offset tbuf
- jnz l24f3
- l24ea: mov al,[bx]
- inc bx
- mov ofiptr,bx
- pop bx
- ret
- ;
- l24f3: cmp al,3
- jb mrkeof
- call prtstr
- db '++UNEXPECTED EOF',0dh,0ah,0
- jmp nxcmd
- ;
- mrkeof: mov al,1ah
- mov [bx],al
- jmp l24ea
- ;
- creatf: push bx
- mov dx,offset fcb
- mov ah,13h
- call bdos
- mov dx,offset fcb
- mov ah,16h
- call bdos
- inc al
- jnz l252f
- call cmerr
- ;
- l252f: xor al,al
- mov byte ptr fcb+32,al
- mov bx,offset tbuf
- mov ofiptr,bx
- pop bx
- ret
- ;
- flushf: mov dx,offset fcb
- mov ah,15h
- call bdos
- or al,al
- jnz l256c
- mov dx,offset fcb
- mov ah,10h
- call bdos
- inc al
- jz l2556
- ret
- ;
- l2556: call prtstr
- db '++CLOSE ERROR',0dh,0ah,0
- jmp nxcmd
- ;
- l256c: call prtstr
- db '++WRITE ERROR',0dh,0ah,0
- wtfchr: push bx
- mov bx,ofiptr
- mov [bx],al
- inc bl
- mov ofiptr,bx
- pop bx
- jz l2590
- ret
- ;
- l2590: push cx
- push dx
- push bx
- mov dx,offset fcb
- mov ah,15h
- call bdos
- or al,al
- jnz l256c
- mov bx,offset tbuf
- mov ofiptr,bx
- pop bx
- pop dx
- pop cx
- ret
- ;
- ;
- dcrlf: mov bx,xcptr
- mov al,bh
- or al,bl
- jz dcrlf3
- call tabc
- mov ch,[bx]
- xor al,al
- or al,ch
- jz dcrlf2
- dcrlf1: inc bx
- mov al,[bx]
- call typech
- dec ch
- jnz dcrlf1
- dcrlf2: mov bx,0
- mov xcptr,bx
- dcrlf3: mov rplptr,bx
- xor al,al
- mov replsw,al
- ;
- crlf: mov al,cinstr
- cmp al,0c3h ;return
- jz separ
- cmp al,0e9h ;jmp
- jz separ
- cmp al,0ebh ;jmps
- jz separ
- cmp al,0c2h ;reti
- jz separ
- cmp al,0cah ;reti
- jz separ
- cmp al,0cbh ;reti
- jz separ
- cmp al,0cfh ;tret
- jz separ
- cmp al,0eah ;jmpf
- jz separ
- ; more can go here .....
- ucrlf: mov al,0dh
- call typech
- mov al,0ah
- jmp typech
- ;
- separ: call ucrlf
- mov al,';'
- mov cinstr,al
- call typech
- jmp ucrlf
- ;
- pstar: mov al,'*' ;2ah
- ;
- typech: push cx
- push dx
- push bx
- mov dl,al
- mov al,replsw
- or al,al
- jnz notlf
- push dx
- mov ah,2
- mov al,quiflg
- or al,al
- jnz l25c8
- push es
- call bdos
- pop es
- l25c8: pop dx
- mov al,wrtflg
- mov bx,offset wfiflg
- and al,[bx]
- mov al,dl
- jz l25d8
- call wtfchr
- l25d8: mov al,dl
- cmp al,0ah
- jnz notlf
- mov al,cntenb
- or al,al
- jz notlf
- mov bx,offset liscnt+1
- dec byte ptr [bx]
- notlf: pop bx
- pop dx
- pop cx
- ret
- ;
- ;
- gtcmd: mov bx,offset segsho ;prompt string
- mov ch,3
- call pstrg
- mov dx,offset cmdbuf
- mov al,78 ;4eh
- xchg bx,dx
- mov [bx],al
- xchg bx,dx
- mov ah,10 ;line input funct
- call bdos
- mov bx,offset cmdbuf+1
- mov dl,[bx]
- mov dh,0
- add bx,dx
- inc bx
- mov byte ptr [bx],0dh
- mov bx,offset cmdbuf+1
- ltucnv: inc bx
- mov al,[bx]
- cmp al,0dh
- jnz l261b
- jmp crlf
- ;
- l261b: cmp al,'a'
- jb ltucnv
- cmp al,'z'+1
- jnb ltucnv
- and al,5fh
- mov [bx],al
- jmp ltucnv
- ;
- prtstr: xor al,al
- mov wfiflg,al
- mov quiflg,al
- pstg: pop si
- xchg bx,si
- push si
- ostrlp: mov al,cs:[bx]
- call typech
- inc bx
- mov al,cs:[bx]
- or al,al
- jnz ostrlp
- inc bx
- pop si
- xchg bx,si
- push si
- ret
- ;
- ;
- initbl: xor al,al
- mov byte ptr symbas+3,al ;zero size byte
- mov bx,offset symbas
- mov symtp,bx ;top = bottom
- mov al,0dh
- mov byte ptr cmdbuf+3,al ;null command
- mov byte ptr ctlbas,' '
- mov word ptr ctlbas+1,-1 ;end flag in addr
- mov cfence,'I' ;initial mode set
- mov bx,offset ctlbas+0c00h
- mov ctltop,bx ;expansion limit
- mov bx,doctbl
- mov al,bh
- or al,bl ;test if defined
- jnz l2670
- ret
- ;
- l2670: mov docend,bx ;end = start
- mov word ptr [bx],0ffffh ;end flag in place
- ret
- ;
- cmpstr: xchg bx,dx
- mov al,[bx]
- xchg bx,dx
- cmp al,[bx]
- jz l2685
- ret
- ;
- l2685: inc dx
- inc bx
- dec cl
- jnz cmpstr
- ret
- ;
- keychk: push cx
- push dx
- push bx
- mov ah,0bh
- call bdos
- or al,al
- jz l26cc
- mov ah,1
- call bdos
- cmp al,3
- jz abort
- call crlf
- jmp nxcmd
- ;
- abort: call prtstr
- db 0dh,0ah,'ABORT Y/N ',0
- mov ah,1
- call bdos
- and al,5fh
- cmp al,'Y' ;59h
- jnz l26c9
- mov ah,0
- mov dl,0
- jmp bdos
- ;
- l26c9: jmp nxcmd
- ;
- l26cc: pop bx
- pop dx
- pop cx
- ret
- ;
- ifasci: cmp al,0dh
- jnz l26d5
- ret
- ;
- l26d5: cmp al,0ah
- jnz l26da
- ret
- ;
- l26da: or al,al
- jnz l26df
- ret
- ;
- l26df: cmp al,' ' ;20h
- jnb l26e4
- ret
- ;
- l26e4: cmp al,7fh
- cmc
- ret
- ;
- bdos: int 21h
- ret
- ;
- ;
- ;
- curofs dw 0 ;active offset value
- curpar dw 0
- ofsptr dw offset cofset ;default code offset
- deltof dw 0 ;curofs-cofset for ctl tbl use
- segsiz dw 0 ;bytes in current segment
- dmpstt dw 00h ;dump start addr initial
- dmpend dw 0100h ;dump end addr initial
- symtbl dw symbas ;addr of symbol table start
- symtp dw symbas ;addr of sym tbl end+1
- pcntr dw 0h ;prog counter for list etc.
- hiload dw 0 ;hi addr of loaded file
- lastwd dw 0100h
- curadr dw 0h
- doctbl dw 0d000h ;comment table start addr
- docend dw 0d000h ;comment table end addr
- ctltbl dw ctlbas ;mode table start addr
- ctltop dw 0 ;mode table end addr
- fndpc dw 0
- fndadd dw 0
- dmpcnt dw 0ffh
- mcbbas dw 0 ;memory control block
- mcbsiz dw 0 ;nr of paras
- mcbext db 0,0 ;mcbext and spare
- ;
- cstbl db ' '
- dw 0,0,0,0
- cofset dw 0h ;default
- ;
- dstbl db ' '
- dw 0,0,0,0
- dofset dw 0h ;default
- ;
- estbl db ' '
- dw 0,0,0,0
- eofset dw 0h ;default
- ;
- sstbl db ' '
- dw 0,0,0,0
- sofset dw 0h ;default
- ;
- db ' '
- dw 0,0,0,0
- dw 0
- ;
- db ' '
- dw 0,0,0,0
- dw 0
- ;
- db ' '
- dw 0,0,0,0
- dw 0
- ;
- db ' '
- dw 0,0,0,0
- dw 0
- db 0 ;table end flag
- ;
- segnam dw 'SC'
- dw 'SD'
- dw 'SE'
- dw 'SS'
- dw 'X1'
- dw 'X2'
- dw 'X3'
- dw 'X4'
- ;
- fake_comtbl:
- db 1
- dw 0,10h,0,0
- db 2
- dw 0,10h,0,0
- db 3
- dw 0,10h,0,0
- db 4
- dw 0,0fffh,0,0
- dw 0,0,0,0
- ;
- lita86 db 'ASM' ;literals for file types
- litcmd db 'COM'
- litctl db 'CTL'
- litsym db 'SMB'
- litdoc db 'DOC'
- litall db 'ALL'
- ;
- rplptr dw 0 ;addr of replacement comment string
- xcptr dw 0
- nxtctl dw 0
- insloc dw 0
- ofiptr dw 0
- segsho db 'C->' ;command prompt string
- nrsegs db 0 ;number of segments loaded
- pfxcnt db 0 ;prefix byte count
- nlblfg db 0 ;flag no label on instr
- trmflg db -1 ;trim flag, label on instr line, dflt on
- segval db 0 ;segment prefix value
- segmsk db 0ch ;curr segment test bits (code def.)
- segflg db 0 ;segment rqst in curr cmd
- opdtyp db 0 ;operand type (size & segment)
- symtyp db 0 ;symbol type (size & segment)
- liscnt db 22
- db 10
- cntenb db 1
- replsw db 0 ;flag for comment repl. instr
- wfiflg db 0
- wrtflg db 0
- quiflg db 0
- sdflg db 0
- cinstr db 0
- strcnt db 0
- ecnt db 0
- adb db 0
- xcsw db 0
- pfflg db 0
- ascbld db 0 ;next 2 items must stay together
- sybflg db 0 ;are accessed as a word
- typndx db 0,0,0
- cmdbuf db 80 dup (?)
- dw 128 dup (?)
- stack dw ?
- cfence db ?
- ctlbas dw 0600h dup(?) ;enough for 300 items
- symbas db ?
-
- code ends
-
- end start
-
-